package com.efounder.util;

import android.content.Context;
import android.util.Log;

import com.bun.miitmdid.core.ErrorCode;
import com.bun.miitmdid.core.IIdentifierListener;
import com.bun.miitmdid.core.MdidSdk;
import com.bun.miitmdid.core.MdidSdkHelper;
import com.bun.miitmdid.supplier.IdSupplier;

/**
 * 设备唯一表示获取
 * 移动安全联盟出的。。
 * Created by zheng on 2019/8/22.
 * 配置文件 supplierconfig.json 只需要设置vivo的appid即可，别的暂时不需要设置
 * 参考文档
 * https://swsdl.vivo.com.cn/appstore/developer/uploadfile/20191109/d6Ybr5/%E7%A7%BB%E5%8A%A8%E6%99%BA%E8%83%BD%E7%BB%88%E7%AB%AF%E8%A1%A5%E5%85%85%E8%AE%BE%E5%A4%87%E6%A0%87%E8%AF%86%E4%BD%93%E7%B3%BB%E7%BB%9F%E4%B8%80%E8%B0%83%E7%94%A8SDK%E5%BC%80%E5%8F%91%E8%80%85%E8%AF%B4%E6%98%8E%E6%96%87%E6%A1%A3v1.10.pdf
 */

public class MiitHelper implements IIdentifierListener {
    private static final String TAG = "MiitHelper";
    private AppIdsUpdater _listener;

    public MiitHelper(AppIdsUpdater callback) {
        _listener = callback;
    }


    public void getDeviceIds(Context cxt) {
        long timeb = System.currentTimeMillis();
        int nres = CallFromReflect(cxt);
//        int nres=DirectCall(cxt);
        long timee = System.currentTimeMillis();
        long offset = timee - timeb;
        if (nres == ErrorCode.INIT_ERROR_DEVICE_NOSUPPORT) {//不支持的设备

        } else if (nres == ErrorCode.INIT_ERROR_LOAD_CONFIGFILE) {//加载配置文件出错

        } else if (nres == ErrorCode.INIT_ERROR_MANUFACTURER_NOSUPPORT) {//不支持的设备厂商

        } else if (nres == ErrorCode.INIT_ERROR_RESULT_DELAY) {//获取接口是异步的，结果会在回调中返回，回调执行的回调可能在工作线程

        } else if (nres == ErrorCode.INIT_HELPER_CALL_ERROR) {//反射调用出错

        }
        Log.d(getClass().getSimpleName(), "return value: " + String.valueOf(nres));

    }


    /*
     * 通过反射调用，解决android 9以后的类加载升级，导至找不到so中的方法
     *
     * */
    private int CallFromReflect(Context cxt) {
        return MdidSdkHelper.InitSdk(cxt, true, this);
    }

    /*
     * 直接java调用，如果这样调用，在android 9以前没有题，在android 9以后会抛找不到so方法的异常
     * 解决办法是和JLibrary.InitEntry(cxt)，分开调用，比如在A类中调用JLibrary.InitEntry(cxt)，在B类中调用MdidSdk的方法
     * A和B不能存在直接和间接依赖关系，否则也会报错
     *
     * */
    private int DirectCall(Context cxt) {
        MdidSdk sdk = new MdidSdk();
        return sdk.InitSdk(cxt, this);
    }

    @Override
    public void OnSupport(boolean isSupport, IdSupplier _supplier) {
        if (_supplier == null) {
            return;
        }


        /**
         * 移动安全联盟
         * （http://www.msa-alliance.cn）
         * 6. 四个 ID 区别，SDK 获取情况
         * 设备唯一标识符（UDID）：设备唯一硬件标识，设备生产时根据特定的硬件
         * 信息生成，可用于设备的生产环境及合法性校验。不对第三方应用提供获取接口，
         * 无法通过 SDK 获取。
         * 匿名设备标识符（OAID）：可以连接所有应用数据的标识符，移动智能终端
         * 系统首次启动后立即生成，可用于广告业务。可以通过 SDK 获取到接口状态（重
         * 置、关闭）、ID 值。
         * 开发者匿名设备标识符（VAID）：用于开放给开发者的设备标识符，可在应
         * 用安装时产生，可用于同一开发者不同应用之间的推荐。可以通过 SDK 获取到 ID值。
         * 应用匿名设备标识符（AAID）：第三方应用获取的匿名设备标识，可在应用
         * 安装时产生，可用于用户统计等。可以通过 SDK 获取到 ID 值。
         */

        //匿名设备标识符最长 64 位，返回空字符串表示不支持，异常状态包括网络异常、appid异常、应用异常等
        String oaid = _supplier.getOAID();
        String vaid = _supplier.getVAID();
        String aaid = _supplier.getAAID();
//        String udid = _supplier.getUDID();
        StringBuilder builder = new StringBuilder();
        builder.append("support: ").append(isSupport ? "true" : "false").append("\n");
//        builder.append("UDID: ").append(udid).append("\n");
        builder.append("OAID: ").append(oaid).append("\n");
        builder.append("VAID: ").append(vaid).append("\n");
        builder.append("AAID: ").append(aaid).append("\n");
        String idstext = builder.toString();
        _supplier.shutDown();

        Log.e(TAG, idstext);
        if (_listener != null) {
            _listener.OnIdsAvalid(isSupport, oaid, vaid, aaid);
        }
    }

    public interface AppIdsUpdater {
        void OnIdsAvalid(boolean isSupport, String oaid, String vaid, String aaid);
    }

}
